function EventEmitter() {
  this._events = {};
}

// 考虑事件 的once属性
// 所以 listener = {listener:listener,once:false}
// 注册事件 传递回调函数
EventEmitter.prototype.on = function (eventName, listener) {
  // 参数判断省略
  var events = this._events;
  // 获取当前事件 所对应的 回调函数listener集合
  var listeners = (events[eventName] = events[eventName] || []);
  // 不重复添加回调
  var isWraped = typeof listener === "object"; // 如果是对象

  if (!listeners.includes(listener)) {
    listensers.push(
      isWraped
        ? listener
        : {
            listener: listener,
            once: false,
          }
    );
  }
  return this;
};

// 触发事件
EventEmitter.prototype.emit = function (eventName, data) {
  // 获取事件的 回调函数集合
  var listeners = this._events[eventName];
  if (!listeners) {
    return;
  }
  for (var i = 0; i < listeners.length; i++) {
    var listener = listeners[i];
    listener.listener.apply(this, data || []);
    if (listener.once) {
      this.off(eventName, listener);
    }
  }
  return this;
};

// once 事件
EventEmitter.prototype.once = function (eventName, listener) {
  return this.on(eventName, { listener: listener, once: true });
};

// off事件
EventEmitter.prototype.off = function (eventName, listener) {
  var listeners = this._events[eventName];
  if (listeners.includes(listener)) {
    var index = listeners.indexOf(listener);
    listeners.splice(index, 1);
  }
  return this;
};
